package com.ezandroid.alphago.engine;

/**
 * Debug
 *
 * @author like
 * @date 2017-07-18
 */
public class Debug {

    public static void printChain(Chain chain) {
        System.err.println("Chain:");
        for (Stone stone : chain.getStones()) {
            System.err.print(stone);
            System.err.print(",");
        }
        System.err.println("");
    }

    public static void printPos() {
        System.err.println("Pos:");
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("|");
                } else {
                    int pos = i * 19 + (j - 1);
                    if (pos < 10) {
                        System.err.print("  " + pos);
                    } else if (pos < 100) {
                        System.err.print(" " + pos);
                    } else {
                        System.err.print(pos);
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printBoard(byte[] board) {
        System.err.println("Board:");
        System.err.print("|-");
        for (int i = 0; i < 19; i++) {
            System.err.print("--");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("| ");
                } else {
                    int player = board[i * 19 + (j - 1)];
                    if (player == Feature48.BLACK) {
                        System.err.print("●");
                    } else if (player == Feature48.WHITE) {
                        System.err.print("○");
                    } else {
                        System.err.print("+");
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|-");
        for (int i = 0; i < 19; i++) {
            System.err.print("--");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printBoardNew(byte[] board) {
        System.err.println("Board:");
        System.err.print("|-");
        for (int i = 0; i < 19; i++) {
            System.err.print("--");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("| ");
                } else {
                    int player = board[i * 19 + (j - 1)];
                    if (player == Feature48.BLACK) {
                        System.err.print("B");
                    } else if (player == Feature48.WHITE) {
                        System.err.print("W");
                    } else {
                        System.err.print("+");
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|-");
        for (int i = 0; i < 19; i++) {
            System.err.print("--");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printFeature(byte[] feature) {
        System.err.println("Feature:");
        for (int i = 0; i < 48; i++) {
            for (int j = 0; j < Feature48.FEATURE_START.length; j++) {
                if (i == Feature48.FEATURE_START[j]) {
                    System.err.print(" ");
                    break;
                }
            }
            System.err.print(feature[i]);
        }
        System.err.println();
    }

    public static void printSelfAtariSize(byte[] selfAtariSize) {
        System.err.println("SelfAtariSize:");
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("|");
                } else {
                    int pos = selfAtariSize[i * 19 + (j - 1)];
                    if (pos < 0) {
                        System.err.print(" " + pos);
                    } else if (pos < 10) {
                        System.err.print("  " + pos);
                    } else if (pos < 100) {
                        System.err.print(" " + pos);
                    } else {
                        System.err.print(pos);
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printCaptureSize(byte[] captureSize) {
        System.err.println("CaptureSize:");
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("|");
                } else {
                    int pos = captureSize[i * 19 + (j - 1)];
                    if (pos < 10) {
                        System.err.print("  " + pos);
                    } else if (pos < 100) {
                        System.err.print(" " + pos);
                    } else {
                        System.err.print(pos);
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printTurnSince(byte[] turnSince) {
        System.err.println("TurnSince:");
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("|");
                } else {
                    int pos = turnSince[i * 19 + (j - 1)];
                    if (pos < 0) {
                        System.err.print(" " + pos);
                    } else if (pos < 10) {
                        System.err.print("  " + pos);
                    } else if (pos < 100) {
                        System.err.print(" " + pos);
                    } else {
                        System.err.print(pos);
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printLibertiesAfter(byte[] libertiesAfter) {
        System.err.println("LibertiesAfter:");
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("|");
                } else {
                    int pos = libertiesAfter[i * 19 + (j - 1)];
                    if (pos < 10) {
                        System.err.print("  " + pos);
                    } else if (pos < 100) {
                        System.err.print(" " + pos);
                    } else {
                        System.err.print(pos);
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printLiberties(byte[] liberties) {
        System.err.println("Liberties:");
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("|");
                } else {
                    int pos = liberties[i * 19 + (j - 1)];
                    if (pos < 10) {
                        System.err.print("  " + pos);
                    } else if (pos < 100) {
                        System.err.print(" " + pos);
                    } else {
                        System.err.print(pos);
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("----");
        }
        System.err.print("|");
        System.err.println();
    }

    public static void printRate(float[] rate) {
        System.err.println("Rate:");
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("-----");
        }
        System.err.print("|");
        System.err.println();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 21; j++) {
                if (j == 0 || j == 20) {
                    System.err.print("|");
                } else {
                    float value = rate[i * 19 + (j - 1)] * 1000 / 10f;
                    if (value < 10.0) {
                        System.err.print(" " + String.format("%.1f", value));
                    } else if (value > 99.9) {
                        System.err.print(" 100");
                    } else {
                        System.err.print(String.format("%.1f", value));
                    }
                    System.err.print(" ");
                }
            }
            System.err.println();
        }
        System.err.print("|");
        for (int i = 0; i < 19; i++) {
            System.err.print("-----");
        }
        System.err.print("|");
        System.err.println();
    }
}
